/*
 * ******************************************************
 *   Copyright ©, 2017-2020, 安徽财金信息科技有限公司
 * ******************************************************
 */
package com.wy.poties.aop;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.wy.poties.utils.Base64Coder;
import com.wy.poties.vo.ApiResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

/**
 * <p>Title:</p>
 * 一句话功能说明
 * <p>Description:</p>
 * 功能描述
 *
 * @author cj021_汪洋
 * @version 1.0
 * @date 2020-11-11 17:41
 */
@Aspect
@Component
@Slf4j
public class SecretAOPController {


    // 是否进行加密解密，通过配置文件注入（不配置默认为true）
    @Value("${isSecret:true}")
    boolean isSecret;

    // 定义切点,使用了@Secret注解的类 或 使用了@Secret注解的方法
    @Pointcut("@annotation(com.wy.poties.aop.Secret)")
    public void pointcut() {

    }

    // 环绕切面
    @Around("pointcut()")
    public String around(ProceedingJoinPoint point) {

        ApiResult obj = new ApiResult();

        // 获取被代理对象
        Object target = point.getTarget();

        Object[] args = point.getArgs();
        // 获取通知签名
        MethodSignature signature = (MethodSignature) point.getSignature();

        try {
            // 获取被代理方法
            Method pointMethod = target.getClass().getMethod(signature.getName(), signature.getParameterTypes());

            Secret secret = pointMethod.getAnnotation(Secret.class);
            // 获取注解上声明的加解密类
            Class clazz = secret.value();


            String result = "";
            if (args.length > 0) {
                result = (String) args[0];
                // 解密
                Map<String, Object> map = new HashMap<>();
                map.put("objId", 1);
                map.put("name", "wy");
                String json = JSONArray.toJSONString(map);
                // 转换vo
                args[0] = JSONArray.parseObject(json, clazz);

                obj = (ApiResult) point.proceed(args);
            }


        } catch (Exception e) {
            System.out.println(e.toString());

        } catch (Throwable throwable) {

            System.out.println(throwable.toString());

        }

        return "hhhh";



        /*// 获取通知签名
        MethodSignature signature = (MethodSignature) point.getSignature();

        try {
            // 获取被代理方法
            Method pointMethod = target.getClass().getMethod(signature.getName(), signature.getParameterTypes());

            String encryptStr = (String) method.invoke(cast);
            // 加密字符串是否为空
            if (StringUtils.isNotBlank(encryptStr)) {
                // 解密
                String json = Base64Coder.decodeString(encryptStr);
                // 转换vo
                args[i] = JSON.parseObject(json, (Type) args[i].getClass());
            }

            // 执行请求
            result = (ApiResult) point.proceed(args);

            // 判断配置是否需要返回加密
            if (isSecret) {
                // 获取返回值json字符串
                String jsonString = JSON.toJSONString(result.getData());
                // 加密
                String s = Base64Coder.encodeString(jsonString);
                result.setData(s);
            }

        } catch (NoSuchMethodException e) {
//            log.error("@Secret注解指定的类没有字段:encryptStr,或encryptStrName参数字段不存在");
            e.printStackTrace();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }*/
//        return result;
    }

    // 转化方法名
    private String getMethedName(String name) {
        String first = name.substring(0, 1);
        String last = name.substring(1);
        first = StringUtils.upperCase(first);
        return "get" + first + last;
    }
}